package cn.shiwei.work;


import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 消费者
 */
public class ConsumerOne {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建链接
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = factory.newConnection();

        // 创建通道
        Channel channel = conn.createChannel();

        // 防止拥堵
        channel.basicQos(1); // 表示该消费者每次只能签收一条信息(拉取信息的数量)(手上的1条信息没签收就暂时不接受信息, 处理了1条信息再接收其他信息)

        // 创建一个回调(Consumer接口子类对象)
        com.rabbitmq.client.Consumer callback = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("得到的信息: " + new String(body));
                System.out.println("consumerTag: " + consumerTag);
                System.out.println("交换机是: " + envelope.getExchange());
                System.out.println("队列名: " + envelope.getRoutingKey());
                System.out.println("信息id: " + envelope.getDeliveryTag());
                /* 手动签收信息 */
                channel.basicAck(
                        envelope.getDeliveryTag(), // 签收的那个信息(信息的id)
                        false // 表示不使用批量签收 // 批量签收, 一次签收多个信息
                );
            }
        };

        // 监听队列
        channel.basicConsume(
                Producer.NAME_QUEUE_WORK, // 监听的队列名
                false, // 关闭自动签收(默认就是手动签收) // 自动签收, 这边一接收, 队列中信息就没了, 如果这边前后后报错了, 信息就没了, 所以用手动签收
                callback // 监听得到的方法, 丢给了这个对象
        );
    }
}
